﻿/**
 * \file Ville.cs
 * \brief classe represantant le moédle des villes possédé par les civilisation
 */ 
namespace Implementation
{
	using interfaces;
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;
    using Wrapper;
    [SerializableAttribute()]
	public class Ville
	{
		private int population;

		private Joueur j;

		private int minerai;

		private int nourriture;

        private int x;

        private int y;

        private int nbRes = 10;

        private string name;

        private int[][] expansion;//1er dim -> la matrice nb*y +x 2e -> coordonnée de la case corespondante


		public unsafe Ville(int a, int b)
		{
            population = 1;
            minerai = 0;
            nourriture = 0;
            x = a;
            y = b;
            j = null;
            expansion = new int[25][];
            WrapperAlgo algo = new WrapperAlgo();
            int ** exp = algo.Map_computeInitializeVille();
            for (int i = 0; i < 25; i++)
            {expansion[i] = new int[2];
                for (int k = 0; k < 2; k++)
                {
                    expansion[i][k] = exp[i][k];
                }
            }
            expansion[16][0] = x;
            expansion[16][1] = y;
            name = genereNom();
		}

        public virtual int getPopulation()
		{
            return population;
		}

		public virtual int getMinerai()
		{
            return minerai;
		}

		public virtual int getNourriture()
		{
            return nourriture;
		}

		public virtual Joueur getJoueur()
		{
            return j;
		}

        public virtual string getName()
        {
            return name;
        }

		public virtual void setJoueur(Joueur joueur)
		{
            j = joueur;
		}

		public virtual void setPopulation(int pop)
		{
            population = pop;
		}

		public virtual void setMinerai(int m)
		{
            minerai = m;
		}

        public virtual int getX()
        {
            return x;
        }

        public virtual int getY()
        {
            return y;
        }

		public virtual void setNourriture(int n)
		{
            nourriture = n;
		}
        
        public virtual int[][] getExpansion()
        {
            return expansion;
        }
        
        public unsafe virtual void setExpansion(int[][] e)
        {
            expansion = e;//pas sur que ça marche simplement comme ça
        }
        /**
         * \fn expensionDeVille
         * \brief decide si il y a expansion de la ville ou non et appelle le collecteur de ressource
         */ 
        public unsafe virtual void expensionDeVille() {
            if (population <= 25) {
                if (nourriture >= nbRes)
                {
                    population ++;
                    nourriture = nourriture - nbRes;
                    nbRes = nbRes + (nbRes / 2);
                    WrapperAlgo algo = new WrapperAlgo();

                    int** exp = algo.Map_computeInitializeVille();
                    for (int i = 0; i < 25; i++)
                    {
                        for (int k = 0; k < 2; k++)
                        {
                            exp[i][k] = expansion[i][k];
                        }
                    }
                    int** exp1 = algo.Map_computeUpdateVille(x, y, exp);//TODO compiler le wrapper
                    for (int i = 0; i < 25; i++)
                    {
                        for (int k = 0; k < 2; k++)
                        {
                            expansion[i][k] = exp1[i][k];
                        }
                    }
                }
                
            }
            extractionRessource();
         }
        /**
         * \fn extractionRessource()
         * \brief extrait les ressources du terrain sur lesquels est la ville
         */ 
        public unsafe virtual void extractionRessource() {
            for (int i = 0; i < 25; i++)
            {
                if (expansion[i][0] != -1)//sinon c'est que l'expansion de la ville est  pas encore faite
                {
                    minerai += j.getJeu().getCarte().getMinerai(expansion[i][0], expansion[i][1]);
                    nourriture += j.getJeu().getCarte().getNouriture(expansion[i][0], expansion[i][1]);
                }
            }
        }

        /**
         * \fn genereNom()
         * \brief genere un nom alléatoire pour la ville à partir de préfixes et de suffixe
         * \return string
         */
        public virtual string genereNom()
        {
            List<string> prefixe = new List<string>{ "Helios", "New", "Grande", "Lucky", "River", "Old", "Vieille", "Sombre","Free", "Banana","Socrate", "Leplumey", "Zombies", "Agua","Thalassa", "Thermos", "Umbrella" };
            List<string> suffixe = new List<string>{ "polis", "town", "ville", "city" };

            Random rand = new Random();
            int r1 = rand.Next(0, prefixe.Count());
            int r2 = rand.Next(0, suffixe.Count());

            return prefixe[r1] + suffixe[r2];
        }

	}
}

